XSPでスプライトを作る
▼ XSPによるスプライト XSPでは複数のスプライトをまとめて複合スプライトと呼ばれる単位で扱う ことができます。16x16 ドットのスプライトを4枚まとめて 32x32 ドットの複 合スプライトを作り、自機を表示する方法については既に述べました。 この場合は複合スプライト中のスプライトの座標を指定する .obj ファイルは 手作業で作成しましたが、これを演算によって自動生成することによってリアル なスプライト表現をすることが可能です。以下、この方法について解説します。 ▼ 爆発パターンの表現 まずはサンプルをご覧ください。 ● サンプル実行=非対応メニューです (ジョイスティックのAボタンでパターンを進め、何かキーを押すと終了しま す) ◎ ソースリスト この爆発パターンはスプライトを最大32枚使って表現しています。一つ一つ の爆発パターンは中心付近から発生し、周囲へと広がりつつも減速し、最後には 消えてしまいます。このような移動計算を自動化し、表示しつつ .OBJ ファイル を作成するのが以下のプログラムです。 ◎ EXPL.C ◎ BOMB.C ◎ FXSP2LIB.C ◎ SEQ.C このプログラムの肝は FXSP2LIB.C です。これはXSPの各関数をファイル出 力に対応させたもので、XSPと同じ引き数を受ける fxsp_???() という関数を 実行すると結果を .OBJ ファイルに出力するというものです。 ---- fxsp2lib.c ---- /* xsp_set_st と置き換えて使うと引き数の構造体を .obj ファイルに書き出す */ short fxsp_set_st (void *sp_work0) -------------------- まずスプライトでキャラクターを表示するプログラムを作り、その中にある xsp_set_st() 関数を fxsp_set_st() 関数に置き換えれば自動的に .OBJ ファイ ルが生成されるという算段です。 各スプライトの移動にあたっては空気抵抗を考慮しています。空気抵抗(粘性 抵抗)は速度に比例することから、以下のような式を用いています。 ---- bomb.c ---- p->vx -= p->vx * 0.2; /* 空気抵抗 */ p->vy -= p->vy * 0.2; ---------------- 空気抵抗を用いないと割とあっさり目の爆発パターンになります(怒首領蜂の 爆発パターンがたぶんこれ)。興味のある方はソースを書き替えて実験してみて 下さい。 空気中なら粘性抵抗が生じるのはともかく、真空の宇宙空間で爆発する時にこ の式を用いるのはどうか?とか、そもそも宇宙空間で赤い炎は出るのか?という 疑問もあるのですが、実際問題として粘性抵抗がないとリアルさに欠けますし、 爆発パターンは赤くないと爆発に見えないことから敢えてこうしています。まあ この辺は創作上のウソですね。そう言えば上記の式の 0.2 という定数もウソで、 見た感じリアルっぽい定数、ということで試行錯誤の末決定しました。今回作成 するのはゲームなのでこのようなことが許されるのですが、シミュレーターを作 るのであればこの辺はきちんと定数を調べて式を作るべきですね。 ▼ ザコキャラの表現 今回のザコキャラは 32x32 ドットの大きさで、32方向に回転するものとしま す。.OBJ ファイルで32方向ぶんの複合スプライトを定義します。複合スプライ トNo.をずらしながら表示することによりキャラクターのアニメーションが表 現できます。 ◎ SEARCHZ.OBJ また、上下対称のキャラクターは16方向ぶんで済みます。 ◎ ZAKO02.OBJ ▼ 中ボスの表現 中ボス(ザコキャラより大きく、ある程度撃ち込まないと倒せないキャラクター) はザコキャラより多くのスプライトを使い、なおかつアニメーションさせること とします。中ボスは複数のパーツで構成され、各パーツの相対座標を変化させる ことによりアニメーションさせるものとします。文章で書くと判り辛いのですが、 要するにこういう事です。 ● サンプル実行=非対応メニューです (マウス左クリックで再表示、右クリックで終了します) この例では左右のパーツが次第に加速しつつ回転移動し、最後に所定の位置へ 固定されて終了します。回転移動は等加速度運動+等速度運動、固定後の振動は ばね運動+減衰を使用してリアルな動きを表現しています。特に重要なのがばね 運動で、これがあるとないのとでは印象がかなり違います。また、ばね運動開始 時に「がちゃーん」という効果音を付けると更にかっこよくなります。この中ボ スのアニメーションも先ほどの爆発パターンのアニメーションと同様、演算結果 からスプライトの座標を算出し、fxsp_xxx() 関数で .OBJ ファイルを生成する という方法で実現しています。主要部分のソースは以下のようになっています。 ◎ ENEMY.C 「男弾」では中ボス一体一体について、同様のプログラムを作り複合スプライ トを作成しました。 スプライトのグラフィックパターンは、複合スプライト生成プログラム作成中 は以下のような仮のものを使ってテストを行い、プログラムが完成したところで グラフィック担当の(す)氏に渡しました。 ◎ 仮作成した中ボス スプライトの大体の大きさと座標が判れば良いのでこの程度で十分です。これ に細かい書き込みを加えたのが先ほどの中ボスです。 ▼ 複合スプライトによるメリット・デメリット 爆発パターンのようなキャラクターは複合スプライトにせずとも単体スプライ トを複数使えば表現可能です。言い替えれば1枚のスプライトで構成された爆発 パターンキャラを32体出現させれば同等の処理は可能です(敵キャラを32体 出現させる処理を考えてみて下さい)。しかしそうするとキャラクターの数が爆 発的に増えるので管理が大変な上、ゲーム中に空気抵抗など乗算の入る処理を使 用すると速度的にも不利になります。そこで複数のスプライトで構成されたキャ ラクターとして爆発パターンを表現してしまえばキャラクター1体ぶんの処理で 済むようになります。 デメリットとしては、まとめてしまうため、各スプライトをバラバラに扱えな いということです。具体例を挙げるとボスキャラに付いたパーツの表現などです。 パーツが1個だけならば、パーツが付いた状態の複合スプライト、パーツがない 状態の複合スプライトだけで済みますが、パーツが複数付いているとその組み合 わせが爆発的に増えてしまいます。このような場合はやはりパーツごとに複合ス プライトを作り、それを組み合わせて使うしかありません。 このように単体スプライトと複合スプライトにはそれぞれメリット・デメリッ トがありますので、それらを踏まえた上で適宜使い分けていくのが良いでしょう。 (EOF)